package com.smart.thrift.discoveryandbalance.discovery;

import cn.hutool.core.util.StrUtil;
import com.smart.thrift.constants.ThriftConstants;
import lombok.Data;

/**
 * 注册中心
 * @param <T> 注册中心客户端
 */
public interface Registry<T> {

    /**
     * 服务注册到注册中心
     * @param serviceName ：服务名
     * @param serverId ：提供该服务的服务器Id
     * @param thriftServerNode ：该服务的提供者节点
     * @throws Exception ：注册过程抛出异常
     */
    void register(String serviceName, String serverId, ThriftServerNode thriftServerNode) throws Exception;

    /**
     * 从注册中心下线服务
     * @param serviceName ：服务名
     * @param serverId ：提供该服务的服务器Id
     * @return ：该服务的提供者节点
     * @throws Exception ：注册过程抛出异常
     */
    ThriftServerNode unregister(String serviceName, String serverId) throws Exception;

    /**
     * 获取该注册中心的客户端
     * @return 客户端
     */
    T getClient();

    /**
     * 客户端类型，目前支持zookeeper，consul
     * @return 客户端类型
     */
    String getClientType();

    /**
     * 注册中心连接属性
     */
    @Data
    class RegistryProperties {


        private static final String REGISTRY_URL_TEMPLATE = "%s:%d";
        /**
         *
         */
        private String discoveryType = ThriftConstants.DiscoveryType.DISCOVERY_DEFAULT;

        /**
         * 服务注册中心的地址
         */
        private String host = "127.0.0.1";

        /**
         * 服务注册中心的端口号(默认2181)
         */
        private Integer port = 2181;

        /**
         * 连接路径
         */
        private String connectString;

        public RegistryProperties() {
        }

        public String getConnectString() {
            return StrUtil.isNotBlank(connectString) ? connectString : String.format(REGISTRY_URL_TEMPLATE, host, port);
        }
    }

    /**
     * 注册中心基本授权信息
     */
    @Data
    class BaseAuthProperties {
        /**
         *
         */
        private String username;

        /**
         *
         */
        private String password;
    }
}
